#include "DynamicArray.h"
#include <iostream>
#include <ctime>
#include <string>
#include "Student.h"


// 释放 Student 对象的函数
void FreeStudent(void *studentPtr)
{
    delete static_cast<Student *>(studentPtr);
}

// 比较两个 Student 对象的函数
int CompareStuID(void *a, void *b)
{
    Student *studentA = static_cast<Student *>(a);
    Student *studentB = static_cast<Student *>(b);
    return studentA->getId() - studentB->getId(); // 假设根据 id 比较
}

int CompareStuName(void *a, void *b)
{
    Student *studentA = static_cast<Student *>(a);
    Student *studentB = static_cast<Student *>(b);
    return studentA->getName().compare(studentB->getName()); // 假设根据 id 比较
}

// 打印 Student 对象的函数
void PrintStudent(void *studentPtr)
{
    Student *student = static_cast<Student *>(studentPtr);
    if (student)
        student->print(); // 调用 Student 的 print 方法
}

int main()
{
    // DynamicArray a;
    // for(int i = 1; i <= 10; i++)
    // {
    //     a.InsertTail(i);
    // }
    // for(int i = 1; i <= 10; i++)
    // {
    //     a.InsertHead(i);
    // }

    // a.InsertByIndex(100,1);
    // a.RemoveByIndex(100);

    // a.RemoveByElement(11);
    // a.show();

    // ElementType *p = a.FindByIndex(7);
    // if(p)
    //     std::cout<<*p<<std::endl;
    // else
    //     std::cout<<"没找到!\n";

    // DynamicArray result = a.FindByElement(10);
    // result.show();

    // a.UpdateByIndex(1,100);
    // a.show();

    // a.UpdateByElement(9,999);
    // a.show();

    // a[0] = 1009;
    // a.show();
    // std::cout<<a[1]<<std::endl;

    // srand(time(nullptr));
    // DynamicArray a;
    // for(int i = 0; i < 20; i++)
    // {
    //     a.InsertTail(rand() % 10 + 1);
    // }
    // a.show();
    // a.Sort();
    // a.show();

    // a.Duplicate();
    // a.show();


    // DynamicArray a;
    // for(int i = 1; i < 10; i+=2)
    //     a.InsertTail(i);

    // a.show();

    // DynamicArray b;
    // for(int i = 2; i <= 10; i+=2)
    //     b.InsertTail(i);

    // b.show();

    // DynamicArray c = a.Merge(b);
    // c.show();


    // DynamicArray a;
    // for(int i = 0; i < 10; i++)
    //     a.InsertTail(rand() % 10 + 1);
    // a.Sort();
    // a.show();

    // DynamicArray b;
    // for(int i = 0; i < 10; i++)
    //     b.InsertTail(rand() % 10 + 1);
    // b.Sort();
    // b.show();

    //DynamicArray c = a.FindInterSection(b);
    //DynamicArray c = a.FindUnionSection(b);
    //DynamicArray c = a.FindDifference(b);
    //c.show();
    //std::cout<<(a == b)<<std::endl;
    //std::cout<<a.BinarySearch(7)<<std::endl;

    // DynamicArray a;
    // a.InsertTail(1);
    // a.InsertTail(2);
    // a.InsertTail(3);
    // a.InsertTail(4);
    // a.show();

    // DynamicArray b;
    // b.InsertTail(3);
    // b.InsertTail(4);
    // b.show();
    //std::cout<<a.Contains(b)<<std::endl;
    // std::cout<<a.ContinueContains(b)<<std::endl;
    //return 0;








    DynamicArray a;
    a.SetCompareFunc(CompareStuID);
    a.SetPrintFunc(PrintStudent);

    Student s1(1, "zhangsan");
    Student s2(2, "lisi");
    Student s3(3, "wangwu");
    Student s4(4, "luyan");
    Student s5(5, "yuzhenjiang");

    a.InsertTail(&s4);
    a.InsertTail(&s5);
    a.InsertTail(&s2);
    a.InsertTail(&s3);

    //a.RemoveByElement(&s3);  //按值删除
    a.show();
    // ElementType *p = a.FindByIndex(2);  //按位置查找
    // if (p)
    //     PrintStudent(*p);
    // else
    //     std::cout << "没找到!\n";
    // DynamicArray result = a.FindByElement(&s3);  //按值查找
    // result.SetPrintFunc(PrintStudent);
    // result.show();

    a.UpdateByIndex(1, &s2);  //按位置修改
    a.show();

    // a.UpdateByElement(&s2, &s1);  //按值修改
    // a.show();

    // a[0] = &s5;  //按位置修改
    // a.show();

    //PrintStudent(a[1]);  //按位置查找
    // a.Sort();
    // a.show();

    // DynamicArray b;
    // b.SetFreeFunc(FreeStudent);  //只要最后一个加就行了，中间加会导致多释放
    // b.SetCompareFunc(CompareStuID);
    // b.SetPrintFunc(PrintStudent);
    // b.InsertTail(&s4);
    // b.InsertTail(&s3);
    // b.Sort();
    // b.show();

    //DynamicArray c = a.Merge(b);p
    //DynamicArray c = a.FindInterSection(b);
    //DynamicArray c = a.FindUnionSection(b);     
    //DynamicArray c = a.FindDifference(b);    
    //c.SetFreeFunc(FreeStudent);
    //c.SetCompareFunc(CompareStuName);
    // c.SetPrintFunc(PrintStudent);
    // c.Sort();
    // c.show();

}